const Busboy = require('busboy');
var path = require('path');
const fs = require('fs');
// stream流式上传
// 文件上传
let clients = [];
router.post("/upload", (req, res) => {
    // 获取请求头中的 content-length，即上传文件的总大小
    const totalSize = req.headers['content-length'];
    let fileSize = 0;

    // 创建一个新的 Busboy 实例，用于处理文件上传
    const busboy = Busboy({ headers: req.headers });
    // 监听文件事件，处理每个上传的文件
    busboy.on('file', (fieldname, file, info) => {
        // 构建保存文件的路径
        const saveTo = path.join(__dirname, '../upload', decodeURIComponent(info.filename));
        const writeStream = fs.createWriteStream(saveTo);

        // 监听文件数据事件，将数据写入文件，并计算文件上传进度
        file.on('data', (data) => {
            writeStream.write(data);
            fileSize += data.length;
            const progress = Math.round((fileSize / totalSize) * 100);
            sendProgress(progress)  // 发送进度信息给所有客户端
        });

        // 监听文件关闭事件，完成文件写入
        file.on('close', () => {
            writeStream.end();
            sendProgress(100) // 发送上传完成的进度信息发送给所有客户端
            console.log('File uploaded successfully');
        });
    });

    // 监听 Busboy 实例的关闭事件，结束响应
    busboy.on('close', () => {
        res.end();
    });

    // 将请求流导入到 busboy 进行处理
    req.pipe(busboy);
})

function sendProgress(progress) {
    // 发送进度条信息给所有客户端
    clients.forEach((client) => {
        client.write(`data:${progress}\n\n`)
    });
}

// SSE 路由用于进度更新
router.get('/progress', (req, res) => {
    res.set({
        'Cache-Control': 'no-cache',
        'Content-Type': 'text/event-stream',
        Connection: 'keep-alive'
    });
    res.flushHeaders();
    clients.push(res); //将新链接的客户端添加到客户端列表
    req.on('close', () => {
        // 链接关闭时，从客户端列表中移除对应的客户端
        clients = clients.filter((clients) => clients !== res)
    })
})